์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ ๋งต ๊ฐ๋ ์ ํ๊ตฌํ์ฌ ๋ค์ค ์ค๋ ๋ ๋๋ ๋น๋๊ธฐ ํ๊ฒฝ์์ ๋ณ๋ ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฐ์ฐ์ผ๋ก ์ฑ๋ฅ์ ๊ฐ์ ํ์ธ์. ์ด์ , ๊ตฌํ ๊ณผ์ ๋ฐ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ๋์์ฑ ๋งต: ํฅ์๋ ์ฑ๋ฅ์ ์ํ ๋ณ๋ ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฐ์ฐ
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ, ํนํ Node.js ํ๊ฒฝ๊ณผ ์น ์์ปค(Web Worker)๋ฅผ ํ์ฉํ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ๋์์ฑ ์ฐ์ฐ ์ํ ๋ฅ๋ ฅ์ ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค. ๋์์ฑ์ด ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ ๋ถ์ผ ์ค ํ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์กฐ์์ ๋๋ค. ์ด ๋ธ๋ก๊ทธ ํฌ์คํธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ ๋งต(Concurrent Map) ๊ฐ๋ ์ ๋ํด ๊น์ด ํ๊ตฌํฉ๋๋ค. ์ด๋ ๋ณ๋ ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฐ์ฐ์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๊ทน์ ์ผ๋ก ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋์์ฑ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํ์์ฑ ์ดํด
๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ดํฐ ๊ตฌ์กฐ, ์๋ฅผ ๋ค์ด ๋ด์ฅ๋ Map์ด๋ Object๋ ๋ณธ์ง์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋ ๋ฐฉ์์
๋๋ค. ์ด๋ ํ ๋ฒ์ ํ๋์ ์ฐ์ฐ๋ง์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ด ํ๋ก๊ทธ๋จ ๋์์ ๋ํ ์ถ๋ก ์ ๋จ์ํํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์์๋ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค:
- ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ: ์น ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ ์ค๋ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ๋, ์ฌ๋ฌ ์์ปค์์ ๊ณต์ ๋
Map์ ๋์์ ์ ๊ทผํ๋ฉด ๊ฒฝ์ ์กฐ๊ฑด(race condition)๊ณผ ๋ฐ์ดํฐ ์์์ ์ด๋ํ ์ ์์ต๋๋ค. - ๋น๋๊ธฐ ์ฐ์ฐ: Node.js๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์์ ์๋ง์ ๋น๋๊ธฐ ์์
(์: ๋คํธ์ํฌ ์์ฒญ, ํ์ผ I/O)์ ์ฒ๋ฆฌํ ๋, ์ฌ๋ฌ ์ฝ๋ฐฑ์ด ๋์์
Map์ ์์ ํ๋ ค๊ณ ์๋ํ์ฌ ์์ธก ๋ถ๊ฐ๋ฅํ ๋์์ ์ ๋ฐํ ์ ์์ต๋๋ค. - ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ : ์ค์๊ฐ ๋ฐ์ดํฐ ๋ถ์, ๊ฒ์ ๊ฐ๋ฐ ๋๋ ๊ณผํ ์๋ฎฌ๋ ์ด์ ๊ณผ ๊ฐ์ด ์ง์ฝ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ตฌ์ฌํญ์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ฑ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ ๊ณตํ๋ ๋ณ๋ ฌ์ฑ์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค.
๋์์ฑ ๋งต์ ์ฌ๋ฌ ์ค๋ ๋๋ ๋น๋๊ธฐ ์ปจํ ์คํธ์์ ๋งต์ ์ฝํ ์ธ ์ ์์ ํ๊ฒ ๋์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฐ์ฐ์ ๋ณ๋ ฌ ์คํ์ด ๊ฐ๋ฅํด์ ธ ํน์ ์๋๋ฆฌ์ค์์ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋์์ฑ ๋งต์ด๋ ๋ฌด์์ธ๊ฐ?
๋์์ฑ ๋งต์ ์ฌ๋ฌ ์ค๋ ๋๋ ๋น๋๊ธฐ ์ฐ์ฐ์ด ๋ฐ์ดํฐ ์์์ด๋ ๊ฒฝ์ ์กฐ๊ฑด ์์ด ๋์์ ์ฝํ ์ธ ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋๋ก ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์์ ์ฌ์ฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค:
- ์์์ ์ฐ์ฐ: ๋จ์ผํ๊ณ ๋๋ ์ ์๋ ๋จ์๋ก ์คํ๋๋ ์ฐ์ฐ์ผ๋ก, ์ฐ์ฐ ์ค์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ฐ์ ํ ์ ์์์ ๋ณด์ฅํฉ๋๋ค.
- ์ ๊ธ(Locking) ๋ฉ์ปค๋์ฆ: ๋ฎคํ ์ค(mutexes)๋ ์ธ๋งํฌ์ด(semaphores)์ ๊ฐ์ ๊ธฐ์ ๋ก, ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํน์ ๋ถ๋ถ์ ์ ๊ทผํ๋๋ก ํ์ฉํ์ฌ ๋์ ์์ ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ฝํ๋ฆฌ(Lock-Free) ๋ฐ์ดํฐ ๊ตฌ์กฐ: ์์์ ์ฐ์ฐ๊ณผ ์๋ฆฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํจ์ผ๋ก์จ ๋ช ์์ ์ธ ์ ๊ธ์ ์์ ํ ํผํ๋ ๊ณ ๊ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค.
๋์์ฑ ๋งต์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ธฐ๋ณธ ํ๋์จ์ด ์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ธ์ด์ ๋จ์ผ ์ค๋ ๋ ํน์ฑ์ผ๋ก ์ธํด ์ง์ ํ ๋์์ฑ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ์น ์์ปค์ ๋น๋๊ธฐ ์ฐ์ฐ ๊ฐ์ ๊ธฐ์ ๊ณผ ์ ์ ํ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋์์ฑ์ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
์น ์์ปค๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์์ฑ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ
์น ์์ปค๋ ๋ณ๋์ ์ค๋ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ๋์์ฑ์ ์๋ฎฌ๋ ์ด์
ํ ์ ์๊ฒ ํด์ค๋๋ค. Map์ ์ ์ฅ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์ ๋ํด ๊ณ์ฐ ์ง์ฝ์ ์ธ ์ฐ์ฐ์ ์ํํ๋ ค๋ ์์๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์์ : ์น ์์ปค์ ๊ณต์ ๋งต์ ์ฌ์ฉํ ๋ณ๋ ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ Map์ด ์๊ณ , ๊ฐ ๊ตญ๊ฐ๋ณ ์ฌ์ฉ์์ ํ๊ท ์ฐ๋ น์ ๊ณ์ฐํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์น ์์ปค์ ๋๋์ด ๊ฐ ์์ปค๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ๋์์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค.
๋ฉ์ธ ์ค๋ ๋ (index.html ๋๋ main.js):
// ๋๊ท๋ชจ ์ฌ์ฉ์ ๋ฐ์ดํฐ Map ์์ฑ
const userData = new Map();
for (let i = 0; i < 10000; i++) {
const country = ['USA', 'Canada', 'UK', 'Germany', 'France'][i % 5];
userData.set(i, { age: Math.floor(Math.random() * 60) + 18, country });
}
// ๊ฐ ์์ปค๋ฅผ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ๋ก ๋ถํ
const numWorkers = 4;
const chunkSize = Math.ceil(userData.size / numWorkers);
const dataChunks = [];
let i = 0;
for (let j = 0; j < numWorkers; j++) {
const chunk = new Map();
let count = 0;
for (; i < userData.size && count < chunkSize; i++) {
chunk.set(i, userData.get(i));
count++;
}
dataChunks.push(chunk);
}
// ์น ์์ปค ์์ฑ
const workers = [];
const results = new Map();
let completedWorkers = 0;
for (let i = 0; i < numWorkers; i++) {
const worker = new Worker('worker.js');
workers.push(worker);
worker.onmessage = (event) => {
const { countryAverages } = event.data;
// ์์ปค๋ก๋ถํฐ ๊ฒฐ๊ณผ ๋ณํฉ
for (const [country, average] of countryAverages) {
if (results.has(country)) {
const existing = results.get(country);
results.set(country, { sum: existing.sum + average.sum, count: existing.count + average.count });
} else {
results.set(country, average);
}
}
completedWorkers++;
if (completedWorkers === numWorkers) {
// ๋ชจ๋ ์์ปค ์์
์๋ฃ
const finalAverages = new Map();
for (const [country, data] of results) {
finalAverages.set(country, data.sum / data.count);
}
console.log('Final Averages:', finalAverages);
}
worker.terminate(); // ์ฌ์ฉ ํ ์์ปค ์ข
๋ฃ
};
worker.onerror = (error) => {
console.error('Worker error:', error);
};
// ์์ปค์๊ฒ ๋ฐ์ดํฐ ์ฒญํฌ ์ ์ก
worker.postMessage({ data: Array.from(dataChunks[i]) });
}
์น ์์ปค (worker.js):
self.onmessage = (event) => {
const { data } = event.data;
const userData = new Map(data);
const countryAverages = new Map();
for (const [id, user] of userData) {
const { country, age } = user;
if (countryAverages.has(country)) {
const existing = countryAverages.get(country);
countryAverages.set(country, { sum: existing.sum + age, count: existing.count + 1 });
} else {
countryAverages.set(country, { sum: age, count: 1 });
}
}
self.postMessage({ countryAverages: countryAverages });
};
์ด ์์ ์์ ๊ฐ ์น ์์ปค๋ ๋ฐ์ดํฐ์ ๋ ๋ฆฝ์ ์ธ ๋ณต์ฌ๋ณธ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๋ช ์์ ์ธ ์ ๊ธ์ด๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ํ์์ฑ์ ํผํ๊ฒ ํด์ค๋๋ค. ๊ทธ๋ฌ๋ ์์ปค์ ์๊ฐ ๋ง๊ฑฐ๋ ๋ณํฉ ์์ ์ ๋ณต์ก๋๊ฐ ๋์ผ๋ฉด ๋ฉ์ธ ์ค๋ ๋์์์ ๊ฒฐ๊ณผ ๋ณํฉ์ด ์ฌ์ ํ ๋ณ๋ชฉ์ด ๋ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค:
- ์์์ ์ ๋ฐ์ดํธ: ์ง๊ณ ์ฐ์ฐ์ด ์์์ ์ผ๋ก ์ํ๋ ์ ์๋ค๋ฉด, SharedArrayBuffer์ Atomics ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ์์ปค์์ ์ง์ ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ ์คํ ๋๊ธฐํ๊ฐ ํ์ํ๋ฉฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ ๋ณต์กํ ์ ์์ต๋๋ค.
- ๋ฉ์์ง ์ ๋ฌ: ๋ฉ์ธ ์ค๋ ๋์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณํฉํ๋ ๋์ , ์์ปค๋ค์ด ์๋ก ๋ถ๋ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์กํ์ฌ ๋ณํฉ ์์ ์ ์ฌ๋ฌ ์ค๋ ๋์ ๋ถ์ฐ์ํฌ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ์ฐ์ฐ๊ณผ ๋ฝ์ ์ด์ฉํ ๊ธฐ๋ณธ ๋์์ฑ ๋งต ๊ตฌํ
์น ์์ปค๊ฐ ์ง์ ํ ๋ณ๋ ฌ์ฑ์ ์ ๊ณตํ์ง๋ง, ๋จ์ผ ์ค๋ ๋ ๋ด์์ ๋น๋๊ธฐ ์ฐ์ฐ๊ณผ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๋์์ฑ์ ์๋ฎฌ๋ ์ด์ ํ ์๋ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ I/O ๋ฐ์ด๋ ์ฐ์ฐ์ด ํํ Node.js ํ๊ฒฝ์์ ํนํ ์ ์ฉํฉ๋๋ค.
๋ค์์ ๊ฐ๋จํ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ๋์์ฑ ๋งต์ ๊ธฐ๋ณธ ์์ ์ ๋๋ค:
class ConcurrentMap {
constructor() {
this.map = new Map();
this.lock = false; // ๋ถ๋ฆฌ์ธ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ๋ฝ
}
async get(key) {
while (this.lock) {
// ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๋๊ธฐ
await new Promise((resolve) => setTimeout(resolve, 0));
}
return this.map.get(key);
}
async set(key, value) {
while (this.lock) {
// ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๋๊ธฐ
await new Promise((resolve) => setTimeout(resolve, 0));
}
this.lock = true; // ๋ฝ ํ๋
try {
this.map.set(key, value);
} finally {
this.lock = false; // ๋ฝ ํด์
}
}
async delete(key) {
while (this.lock) {
// ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๋๊ธฐ
await new Promise((resolve) => setTimeout(resolve, 0));
}
this.lock = true; // ๋ฝ ํ๋
try {
this.map.delete(key);
} finally {
this.lock = false; // ๋ฝ ํด์
}
}
}
// ์ฌ์ฉ ์์
async function example() {
const concurrentMap = new ConcurrentMap();
// ๋์ ์ ๊ทผ ์๋ฎฌ๋ ์ด์
const promises = [];
for (let i = 0; i < 10; i++) {
promises.push(
(async () => {
await concurrentMap.set(i, `Value ${i}`);
console.log(`Set ${i}:`, await concurrentMap.get(i));
await concurrentMap.delete(i);
console.log(`Deleted ${i}:`, await concurrentMap.get(i));
})()
);
}
await Promise.all(promises);
console.log('Finished!');
}
example();
์ด ์์ ๋ ๊ฐ๋จํ ๋ถ๋ฆฌ์ธ ํ๋๊ทธ๋ฅผ ๋ฝ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. Map์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ๊ธฐ ์ ์, ๊ฐ ๋น๋๊ธฐ ์ฐ์ฐ์ ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ฝ์ ํ๋ํ๊ณ , ์ฐ์ฐ์ ์ํํ ๋ค์ ๋ฝ์ ํด์ ํฉ๋๋ค. ์ด๋ ํ ๋ฒ์ ํ๋์ ์ฐ์ฐ๋ง์ด Map์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ฌ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํฉ๋๋ค.
์ค์ ์ฐธ๊ณ : ์ด๊ฒ์ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์์ ์ด๋ฉฐ ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ์ด๋ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ฉฐ ๊ต์ฐฉ ์ํ(deadlock)์ ๊ฐ์ ๋ฌธ์ ์ ์ทจ์ฝํฉ๋๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ธ๋งํฌ์ด๋ ๋ฎคํ ์ค์ ๊ฐ์ ๋ ๊ฒฌ๊ณ ํ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค์ฌํญ
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์์ฑ ๋งต์ ๊ตฌํํ๋ ๊ฒ์ ์ฌ๋ฌ ๊ฐ์ง ๊ณผ์ ๋ฅผ ์ ์ํฉ๋๋ค:
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๋จ์ผ ์ค๋ ๋ ํน์ฑ: ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ทผ๋ณธ์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋์ด๋ฏ๋ก ๋ฌ์ฑํ ์ ์๋ ์ง์ ํ ๋ณ๋ ฌ์ฑ์ ์ ๋์ ํ๊ณ๊ฐ ์์ต๋๋ค. ์น ์์ปค๋ ์ด ์ ํ์ ์ฐํํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ ์ผ๊ธฐํฉ๋๋ค.
- ๋๊ธฐํ ์ค๋ฒํค๋: ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํค๋ฉฐ, ์ ์คํ๊ฒ ๊ตฌํํ์ง ์์ผ๋ฉด ๋์์ฑ์ ์ฑ๋ฅ ์ด์ ์ ์์ํ ์ ์์ต๋๋ค.
- ๋ณต์ก์ฑ: ๋์์ฑ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ณ ๊ตฌํํ๋ ๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ๋ณต์กํ๋ฉฐ, ๋์์ฑ ๊ฐ๋ ๊ณผ ์ ์ฌ์ ์ธ ํจ์ ์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
- ๋๋ฒ๊น : ๋์์ฑ ์ฝ๋์ ๋น๊ฒฐ์ ์ ์ธ ์คํ ํน์ฑ ๋๋ฌธ์ ๋๋ฒ๊น ์ ๋จ์ผ ์ค๋ ๋ ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์์ฑ ๋งต์ ์ฌ์ฉ ์ฌ๋ก
์ด๋ฌํ ๊ณผ์ ์๋ ๋ถ๊ตฌํ๊ณ ๋์์ฑ ๋งต์ ์ฌ๋ฌ ์๋๋ฆฌ์ค์์ ๊ฐ์น๊ฐ ์์ ์ ์์ต๋๋ค:
- ์บ์ฑ: ์ฌ๋ฌ ์ค๋ ๋๋ ๋น๋๊ธฐ ์ปจํ ์คํธ์์ ์ ๊ทผํ๊ณ ์ ๋ฐ์ดํธํ ์ ์๋ ๋์์ฑ ์บ์ ๊ตฌํ.
- ๋ฐ์ดํฐ ์ง๊ณ: ์ค์๊ฐ ๋ฐ์ดํฐ ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ์์ค์์ ๋์์ ๋ฐ์ดํฐ ์ง๊ณ.
- ์์ ํ: ์ฌ๋ฌ ์์ปค๊ฐ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์์ ํ ๊ด๋ฆฌ.
- ๊ฒ์ ๊ฐ๋ฐ: ๋ฉํฐํ๋ ์ด์ด ๊ฒ์์์ ๊ฒ์ ์ํ๋ฅผ ๋์์ ๊ด๋ฆฌ.
๋์์ฑ ๋งต์ ๋์
๋์์ฑ ๋งต์ ๊ตฌํํ๊ธฐ ์ ์, ๋ค์๊ณผ ๊ฐ์ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ๋ ์ ํฉํ ์ ์๋์ง ๊ณ ๋ คํด ๋ณด์ธ์:
- ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ: ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋ ํ์๋ ์์ ๋ ์ ์๋๋ก ๋ณด์ฅํจ์ผ๋ก์จ ์ ๊ธ์ ํ์์ฑ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. Immutable.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ฉ์์ง ์ ๋ฌ: ์ค๋ ๋๋ ๋น๋๊ธฐ ์ปจํ ์คํธ ๊ฐ์ ํต์ ์ ๋ฉ์์ง ์ ๋ฌ์ ์ฌ์ฉํ๋ฉด ๊ณต์ ๊ฐ๋ณ ์ํ์ ํ์์ฑ์ ์์ ํ ํผํ ์ ์์ต๋๋ค.
- ๊ณ์ฐ ์คํ๋ก๋ฉ: ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๋ฐฑ์๋ ์๋น์ค๋ ํด๋ผ์ฐ๋ ํจ์๋ก ์คํ๋ก๋ฉํ๋ฉด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ํ๋ณดํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์๋ต์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๋์์ฑ ๋งต์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ณ๋ ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฐ์ฐ์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋จ์ผ ์ค๋ ๋ ํน์ฑ๊ณผ ๋์์ฑ์ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ๊ตฌํ์ ์ด๋ ค์์ด ์์ง๋ง, ๋ค์ค ์ค๋ ๋ ๋๋ ๋น๋๊ธฐ ํ๊ฒฝ์์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ฅ๋จ์ ์ ์ดํดํ๊ณ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ ๋์์ฑ ๋งต์ ํ์ฉํ์ฌ ๋ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋์์ฑ ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ๋๊ธฐํ ์ค๋ฒํค๋๋ณด๋ค ์ฑ๋ฅ ์ด์ ์ด ๋ ํฐ์ง ํ์ธํ๊ธฐ ์ํด ์ฒ ์ ํ๊ฒ ํ ์คํธํ๊ณ ๋ฒค์น๋งํนํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
๋ ์์๋ณด๊ธฐ
- Web Workers API: MDN ์น ๋ฌธ์
- SharedArrayBuffer ๋ฐ Atomics: MDN ์น ๋ฌธ์
- Immutable.js: ๊ณต์ ์น์ฌ์ดํธ